<?php
// *****************************************************************************
// Модуль Shell
// Префикс switch_
// Автор: Алексей Дьяченко
// Библиотека распространяется по лицензии GPL
// Принять участие в разработке или скачать новую версию вы можете на сайте
// http://www.my-site.ru/
/*
	Copyright 2006-2007 Alex Djachenko http://www.my-site.ru
	Authors: Alex Djachenko
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/
// *****************************************************************************

$MT_mod_globals='';

// ************************************************
// Задаем настройки по умолчанию
$MT_mod_cfg = array();
// Переменная в $_GET, через которую передается путь 
$MT_mod_cfg['urlvar'] = 's';
$MT_mod_cfg['urltype'] = 'pathinfo';
// Настройки вызова branch по умолчанию
$MT_mod_cfg['main_mod'] = 'switch';
$MT_mod_cfg['main_branch'] = 'hello';
$MT_mod_cfg['main_file'] = 'switch.php';
$MT_mod_cfg['main_disp'] = 0;
// Подключаем файл с настройками
include mst_modpath($MT_mod_name,'cfg/config.php');

// Подключаем библиотеки
include mst_modpath($MT_mod_name,'lib/urlmaker.php');
include mst_modpath($MT_mod_name,'lib/loader.php');
include mst_modpath($MT_mod_name,'lib/bswitcher.php');
// ************************************************




// ----
// Функция генерации url для my-site (внутри модуля используется switch_makeurl
function switch_shell_url($filename='')
{   // Возвращаем URL внутри модуля
    // Эта функция обьявляется для модулей, используемых в качестве shell
    $urlvar = mst_getcfgmod('switch','urlvar');
    if(empty($filename))
    {   // Пустой путь внутри shell
        return '';
    }
    $filename_array=explode('/',$filename);
    if('URL'==$filename_array[0])
    {   // Запрошен url от корня shell
        $filename_url=implode('/',array_slice($filename_array,1));
    }elseif ('VAR'==$filename_array[0])
	{	// Запрошен url в другой переменной от корня shell
		$filename_url="?{$filename_array[1]}="
			.switch_makepath(array_slice($filename_array,2));
    }else
    {   // Нет ключевого слова - весь путь идет в fuseaction
		$url_type = mst_getcfgmod('switch','urltype');
		if ('get' == $url_type)
		{
			//
			$filename_url="?{$urlvar}=".switch_makepath($filename_array);
		}elseif ('pathinfo' == $url_type)
		{
			//  Путь передается через _SERVER["PATH_INFO"]
			$filename_url=switch_makepath($filename_array);
		}
        
    }
    return $filename_url;
}

/**
 * Запустить branch и вернуть контент
 * @param $branch_MT_mod_name - имя модуля, которому принадлежит branch
 * @param $branch - имя запускаемого branch
 * @param $file - имя файла (обычно switch.php)
 * @param $urlvar - имя переменной с путем
 * @param $disp - смещение от начала пути
 * @param $urltype - способ передачи пути в url
 * @param $path - виртуальный путь
 * @return string
 */
function switch_run($branch_MT_mod_name,$branch,$file,
						$urlvar,$disp=0,$urltype='get',
						$path=null)
{
	//
	// Создаем объект управления интерфейсом
	$Shell = new switch_loader('switcher');
	// Создаем urlmaker

	$urlmaker = new switch_urlmaker(
					$urltype,$urlvar,
					null);
	// Обрабатываем файл с бизнес-логикой
	return $Shell->process($branch_MT_mod_name,$branch,$file,$disp,$urlmaker,$path,null,true);
}

// *******
// Утилиты
// *******
function switch_isadmin()
{
	// Проверяем авторизацию
	//
	$admin_auth_type = mst_getcfgmod('switch','admin_auth_type');
	if (!is_array($admin_auth_type))
	{
		// Настройки доступа не заданы
		return false;
	}
	session_start();
	if (@$_SESSION['switch_admin']=='true')
	{
		return true;
	}
	foreach ($admin_auth_type as $auth_type)
	{
		//
		switch ($auth_type)
		{
			// Проверяем авторизацию по указанному методу
			case 'localhost':
				if ($_SERVER["REMOTE_ADDR"] == $_SERVER["SERVER_ADDR"])
				{
					//
					return true;
				}
			break;
			case 'pass':
				// Метод авторизации пока не реализован
				if (mst_getcfgmod('switch','admin_auth_pass') == $_GET["skey"])
				{
					//
					$_SESSION['switch_admin']='true';
					return true;
				}
			break;
			case 'users':
				// Метод авторизации пока не реализован
				return false;
			break;
			case 'mauth':
				// Метод авторизации через модуль mauth
                mst_initmod('mauth');
                if (mauth_this_isauth())
                {
                    $admin_auth_mauth = mst_getcfgmod('switch','admin_auth_mauth');
                    $id = mauth_this_id();
                    $wlogin = mauth_this_wholelogin();
                    if (in_array($id,$admin_auth_mauth['id']))
                    {
                        $_SESSION['switch_admin']='true';
                        return true;
                    }
                    if (in_array($wlogin,$admin_auth_mauth['wlogins']))
                    {
                        $_SESSION['switch_admin']='true';
                        return true;
                    }
                }
				return false;
			break;
			case 'access':
				// Метод авторизации пока не реализован
                mst_initmod('access');
                if (access_isaccess2nameobj_mauth('switch','admin','view'))
                {
                    $_SESSION['switch_admin']='true';
                    return true;
                }
				return false;
			break;
		}
	}
	$_SESSION['switch_admin']='false';
	return false;
}
/**
 * Разбор пути в массив
 * @param $path
 * @return array
 */
function switch_util_parsepath($path,$noendslashes=false)
{
	if (is_array($path)){return $path;}
	$result =  explode('/',$path);
	// Удаляем все пустые элементы
	$result =  array_filter($result, "switch_util_nonull");
	// Кроме последнего, обозначающего завершающий слешь
	if ('/'===substr($path,-1) AND !$noendslashes)
	{
		$result[] = null;
	}
	// print_r($result);
	return $result;
}
function switch_util_nonull($val)
{
	//
	return strlen((string) $val)>0;
}
function switch_modlist($branchlist='',$modlist=null)
{
	// Выдает список модулей, имеющих перечисленные branches
	$result = array();
	$branchlist = explode(',',trim($branchlist));
	if (is_null($modlist))
	{
		// Получаем список модулей из ядра
		$modlist = mst_modlist();
	}else
	{
		// Список модулей нам передали
		$modlist = explode(',',trim($modlist));
	}
	foreach ($modlist as $this_mod)
	{
		// Перебираем модули
		foreach ($branchlist as $this_branch)
		{
			// Ищим branches
			 if(mst_modpath($this_mod,'switch/'.$this_branch,true,false))
			 {
				 // Бренч существует
				 $result[] = array('mod_name'=>$this_mod,'branch_name'=>$this_branch);
			 }
		}
	}
	return $result;
}
?>
